package com.by.cloud.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.by.cloud.common.PageResult;
import com.by.cloud.model.dto.user.*;
import com.by.cloud.model.entity.User;
import com.by.cloud.model.vo.user.UserLoginVo;
import com.by.cloud.model.vo.user.UserVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author lzh
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param userRegisterRequest 注册请求信息
     * @return 用户ID
     */
    long userRegister(UserRegisterRequest userRegisterRequest);

    /**
     * 用户登录
     *
     * @param userLoginDto 登录请求信息
     * @return
     */
    UserLoginVo login(UserLoginDto userLoginDto);

    /**
     * 根据ID获取用户信息
     *
     * @param userId 用户ID
     * @return 脱敏信息
     */
    UserVo getUserById(Long userId);

    /**
     * 分页查询用户信息
     *
     * @param userPageRequest 分页请求信息
     * @return 分页结果
     */
    PageResult<UserVo> pageUsers(UserPageRequest userPageRequest);

    /**
     * 根据用户id批量查询用户信息
     *
     * @param userIds 用户id集合
     * @return
     */
    List<UserVo> getUserByIdList(List<Long> userIds);

    /**
     * 根据传入用户信息更新用户信息
     *
     * @param userDto 用户更新dto
     * @return
     */
    boolean updateByUserInfo(UserUpdateDto userDto);

    /**
     * 查询当前登录用户
     *
     * @return
     */
    UserVo getCurrentUserInfo();

    /**
     * 根据userId是否冻结用户
     *
     * @param userIds 用户id集合
     * @param status  是否冻结 传入的是想更改的状态 0冻结 1可用
     * @return
     */
    boolean freezeByUserId(List<Long> userIds, Integer status);

    /**
     * 管理员根据传入用户信息更新用户信息
     *
     * @param userDto 用户信息
     * @return
     */
    boolean updateByAdmin(UserUpdateAdminDto userDto);

    /**
     * 根据ID删除用户
     *
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean removeUserById(Long userId);

    /**
     * 上传头像
     *
     * @param multipartFile 文件
     * @return 头像url
     */
    String uploadAvatar(MultipartFile multipartFile);

    /**
     * 判断是否为管理员
     * @param userId 用户id
     * @return 是否为管理员
     */
    boolean isAdmin(Long userId);
}
